package leetcode;

import java.util.Arrays;

/**
 * @author by 何坤
 * @Classname LeetCode01
 * @Description TODO
 * @Date 2019/11/13 14:26
 */
public class LeetCode01 {
    public static void main(String[] args) {
//        int[] input = new int[]{9,8,9};
//        int[] ints = pushOne(input);
//        Arrays.stream(ints).forEach(System.out::println);


        String s = addBinary("100101", "1011011");
        System.out.println(s);
    }

    /**
     * 给定一个由整数组成的非空数组所表示的非负整数，在该数的基础上加一。
     *
     * 最高位数字存放在数组的首位， 数组中每个元素只存储单个数字。
     *
     * 你可以假设除了整数 0 之外，这个整数不会以零开头。
     *
     * 示例 1:
     *
     * 输入: [1,2,3]
     * 输出: [1,2,4]
     * 解释: 输入数组表示数字 123。
     * 示例 2:
     *
     * 输入: [4,3,2,1]
     * 输出: [4,3,2,2]
     * 解释: 输入数组表示数字 4321。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/plus-one
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param
     * @param digits
     * @return int[]
     * @date 2019/11/13 14:28
     * @author 何坤
     */
    private static int[] pushOne(int[] digits){
        for (int i = digits.length-1; i>=0; i--){
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0){
                return digits;
            }
        }
        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }

    /**
     * 给定两个二进制字符串，返回他们的和（用二进制表示）。
     *
     * 输入为非空字符串且只包含数字 1 和 0。
     *
     * 示例 1:
     *
     * 输入: a = "11", b = "1"
     * 输出: "100"
     * 示例 2:
     *
     * 输入: a = "1010", b = "1011"
     * 输出: "10101"
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/add-binary
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param a
     * @param b
     * @return java.lang.String
     * @date 2019/11/13 14:45
     * @author 何坤
     */
    private static String addBinary(String a, String b){
        int flag = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = a.length()-1, j = b.length()-1; i>=0 || j>=0; i--, j--){
            int sum = flag;
            sum += (i>=0 ? a.charAt(i) - '0' : 0);
            sum += (j>=0 ? b.charAt(j) - '0' : 0);
            sb.append(sum%2);
            flag = sum/2;
        }
        sb.append(flag == 1 ? 1 : "");
        return sb.reverse().toString();
    }
}
